©PaperWeekly 原创 · 作者 | 苏剑林 学习句向量的方案大致上可以分为无监督和有监督两大类,其中有监督句向量比较主流的方案是 Facebook 提出的“InferSent” [1] ,而后的“Sentence-BERT” [2] 进一步在 BERT 上肯定了它的有效性。然而,不管是 InferSent 还是 Sentence-BERT,它们在理论上依然相当令人迷惑,因为它们虽然有效,但存在训练和预测不一致的问题,而如果直接优化预测目标 cos 值,效果往往特别差。
最近,笔者再次思考了这个问题,经过近一周的分析和实验,大致上确定了 InferSent 有效以及直接优化 cos 值无效的原因,并提出了一个优化 cos 值的新方案 CoSENT(Cos ine Sent ence)。实验显示,CoSENT 在收敛速度和最终效果上普遍都比 InferSent 和 Sentence-BERT 要好。 本文的场景是利用文本匹配的标注数据来构建句向量模型,其中所利用到的标注数据是常见的句子对样本,即每条样本是“(句子 1, 句子 2, 标签) ”的格式,它们又大致上可以分类“是非类型”、“NLI 类型”、“打分类型”三种,参考《用开源的人工标注数据来增强 RoFormer-Sim》 中的“分门别类”一节。
简单起见,我们可以先只考虑“是非类型”的数据,即“(句子 1, 句子 2, 是否相似) ”的样本。假设两个句子经过编码模型后分别得到向量 ,由于检索阶段计算的是余弦相似度 ,所以比较自然的想法是设计基于 的损失函数,比如 其中 表示是否相似。类似的 loss 还可以写出很多,大致的意思都是让正样本对的相似度尽可能大、负样本对的相似度尽可能小。然而,直接优化这些目标的实验结果往往特别差(至少明显比 InferSent 要差),在某些情况下甚至还不如随机初始化的效果。
这是因为,通常文本匹配语料中标注出来的负样本对都是“困难样本”,常见的是语义不相同但字面上有比较多的重合。此时,如果我们用式(1)作为损失函数,那么正样本对的目标是 1、负样本对的目标是 -1,如果我们用式(2)作为损失函数,那么正样本对的目标是 1、负样本对的目标是 0。
不管哪一种,负样本对的目标都“过低”了,因为对于“困难样本”来说,虽然语义不同,但依然是“相似”,相似度不至于 0 甚至 -1 那么低,如果强行让它们往 0、-1 学,那么通常的后果就是造成过度学习,从而失去了泛化能力,又或者是优化过于困难,导致根本学不动。
要验证这个结论很简单,只需要把训练集的负样本换成随机采样的样本对(视作更弱的负样本对),然后用上述 loss 进行训练,就会发现效果反而会变好。如果不改变负样本对,那么缓解这个问题的一个方法是给负样本对设置更高的阈值,比如 这样一来,负样本对的相似度只要低于 0.7 就不优化了,从而就不那么容易过度学习了。但这仅仅是缓解,效果也很难达到最优,而且如何选取这个阈值依然是比较困难的问题。
让人倍感神奇的是,训练和预测不一致的 InferSent 和 Sentence-BERT,却在这个问题上表现良好。以 Sentence-BERT 为例,它的训练阶段是将 (其中 是指 的每个元素都取绝对值后构成的向量)拼接起来做为特征,后面接一个全连接层做 2 分类(如果是 NLI 数据集则是 3 分类),而在预测阶段,还是跟普通的句向量模型一样,先计算句向量然后算 cos 值作为相似度。如下图所示:
▲ 训练阶段的Sentence-BERT
▲ 预测阶段的Sentence-BERT
为什么 InferSent 和 Sentence-BERT 会有效?在《用开源的人工标注数据来增强RoFormer-Sim》 中的“闭门造车 ”一节笔者给出了一个基于容错性的解释,而经过这段时间的思考,笔者对这个问题有了一个新的理解,这里再跟大家分享交流一下。
一般情况下,哪怕负样本对是“困难样本”,总体而言正样本对的字面相似度是大于负样本对的,这样一来,哪怕是对于初始模型,正样本对的差距 总体较小,而负样本对的差距 总体较大,我们可以想象正样本对的 主要分布在一个半径较小的球面附近,而负样本对的 分布在一个半径较大的球面附近,也就是说,初始阶段 本身就有聚类倾向,我们接下来只需要根据标签信息强化这种聚类倾向,使得正样本对的 依然保持更小,负样本对的 保持更大。一个直接的做法就是 后面接一个 Dense 分类器,然而常规的分类器是基于内积的,它没法区分两个分布在不同球面的类别,所以我们加上绝对值变成 ,将球面变为锥形,此时就可以用 Dense 分类层来分类了。这就是笔者认为的 的来源。 至于 的拼接,笔者认为是用来消除各向异性的。像“BERT+[CLS]”的句向量模型,在初始阶段具有严重的各向异性,这种各向异性对句向量的效果有着比较严重的负面影响,而 只是向量的相对差距,无法明显改善这种各向异性。而 拼接之后接 Dense 层,由于 Dense 层的类别向量是随机初始化的,所以相当于给了 一个随机的优化方向,迫使它们各自“散开”,远离当前的各向异性状态。
InferSent 和 Sentence-BERT 虽然有效,但也存在比较明显的问题。
比如,前面说了它有效的原因是初始阶段就有聚类倾向,而标签训练只是强化这个聚类倾向信息,所以“初始阶段就有聚类倾向”就显得相当重要,它意味着其效果比较依赖于初始模型,比如“BERT+平均池化”的最终效果就优于“BERT+[CLS]”,因为前者在初始阶段的区分度就更好。
此外,InferSent 和 Sentence-BERT 终究是训练和预测不一致的方案,所以存在一定的概率会“训崩”,具体表现为训练 loss 还在下降,训练 acc 还在提升,但是基于余弦值的评测指标(如 Spearman 系数)却明显下降,哪怕是训练集也是如此。这说明训练还是正常进行的,但是已经脱离了“正样本对的 更小、负样本对的 更大”的分类依据,从而余弦值就崩了。 InferSent 和 Sentence-BERT 还存在调优困难问题,这同样是因为训练和预测的不一致性,导致我们很难确定对哪些训练过程的调整会给预测结果带来正面帮助。
简单来说,就是 InferSent 和 Sentence-BERT 算是一种可用的方案,但存在诸多的不确定性。那难道优化 cos 值就真的没有出头之日了吗?当然不是。早前的 SimCSE 其实也有一个有监督版,它也是直接优化 cos 值,但它要用到“(原始句子, 相似句子, 不相似句子) ”格式的三元组数据。而本文提出的 CoSENT,则进一步改进了上述思路,使得训练过程只用到句子对样本。
我们记 为所有的正样本对集合, 为所有的负样本对集合,其实我们是希望对于任意的正样本对 和负样本对 ,都有 其实 是它们各自的句向量。说白了,我们只希望正样本对的相似度大于负样本对的相似度,至于大多少,模型自己决定就好。事实上语义相似度常见的评价指标 spearman也 是一样,它只依赖于预测结果的相对顺序,而不依赖于具体的值。
简单来说,就是如果你希望最终实现 ,那么就往 里边加入 一项。对应我们这里的场景,我们可以得到损失函数 其中 是一个超参数,本文后面的实验取了 20。这就是 CoSENT 的核心内容了,它是一个优化 cos 值的新的损失函数。
可能有读者质疑:就算这里的式(6)真的可用,那也只适用于二分类数据,像 NLI 数据是 3 分类的就不能用了?
事实上,式(6)本质上是一个为排序设 计的损失函数,它可以更加通用地写成: 也就是说,只要我们认为样本对 的真实相似度应该大于 的真实相似度,就可以往 里边加入 ;换句话说,只要我们能够为样本对设计顺序,那么就可以用式(7)。 对于 NLI 数据而言,它有“蕴含”、“中立”、“矛盾”三种标签,我们自然可以认为两个“蕴含”的句子相似度大于两个“中立”的句子,而两个“中立”的句子相似度大于两个“矛盾”的句子,这样基于这三种标签就可以为 NLI 的句子对排序了。而有了这个排序后,NLI 数据也可以用 CoSENT 来训练了。类似地,对于 STS-B 这种本身就是打分的数据,就更适用于 CoSENT 了,因为打分标签本身就是排序信息。
当然,如果多类别之间没有这种序关系,那就不能用 CoSENT 了。然而,对于无法构建序关系的多类别句子对数据,InferSent 和 Sentence-BERT 能否出合理的句向量模型,笔者也是持怀疑态度。目前没看到类似的数据集,也就无从验证了。 优秀的效果
笔者在多个中文数据集上对 CoSENT 进行了实验,分别比较了在原有训练集上训练以及在 NLI 数据集训练两种方案,大多数实验结果都表明 CoSENT 明显优于 Sentence-BERT。测试数据集同《无监督语义相似度哪家强?我们做了个比较全面的评测》 ,每个数据集都被划分为 train、valid、test 三部分,评测指标是预测值和标签的 spearman 系数。
https://github.com/bojone/CoSENT 下面是用各自的 train 集进行训练后,test 集的效果: 下面则是用开源的 NLI 数据作为训练集进行训练后,每个任务的 test 集的效果:
可以看到,大多数任务上 CoSENT 都有较为明显的提升,而个别有任务上的下降也是比较小的(1% 以内),原生训练的平均提升幅度超过 6%,而 NLI 训练的平均提升幅度也有 1% 左右。
此外,CoSENT 还有更快的收敛速度,比如“BERT+CoSENT+ATEC”的原生训练,第一个 epoch 的 valid 结果就有 48.78,而对应的“Sentence-BERT+ATEC”只有 41.54;“RoBERTa+CoSENT+PAWSX”的原生训练,第一个 epoch 的 valid 结果就有 57.66,而对应的“Sentence-RoBERTa+PAWSX”只有 10.84;等等。
可能有的读者会问式(6)或式(7)跟 SimCSE 或对比学习有什么不同?从损失函数的形式上来看两者确有一点相似之处,但含义完全不同的。
标准的 SimCSE 是只需要正样本对的(通过 Dropout 或者人工标注构建),然后它将 batch 内的所有其他样本都视为负样本;而有监督版的 SimCSE 则是需要三元组的数据,它实际上就是把困难样本补充到标准的 SimCSE上,即负样本不只有 batch 内的所有其他样本,还有标注的困难样本,但同时正样本依然不能缺,所以需要“(原始句子, 相似句子, 不相似句子) ”的三元组数据。
至于 CoSENT,它只用到了标注好的正负样本对,也不包含随机采样 batch 内的其他样本来构建负样本的过程,我们也可以将它理解为对比学习,但它是“样本对”的对比学习,而不是像 SimCSE 的“样本”对比学习,也就是说,它的“单位”是一对句子而不是一个句子。
本文提出了一种新的有监督句向量方案 CoSENT(Cosine Sentence),相比于 InferSent 和 Sentence-BERT,它的训练过程更贴近预测,并且实验显示,CoSENT 在收敛速度和最终效果上都普遍比 InferSent 和 Sentence-BERT 要好。 [1] https://arxiv.org/abs/1705.02364
[2] https://arxiv.org/abs/1908.10084
感谢 TCCI 天桥脑科学研究院对于 PaperWeekly 的支持。TCCI 关注大脑探知、大脑功能和大脑健康。
#投 稿 通 道 #
让你的文字被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读 ,也可以是学术热点剖析 、科研心得 或竞赛经验讲解 等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品 ,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬 ,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱: hr@paperweekly.site
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02 )快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」 也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」 订阅我们的专栏吧